經過前幾天的開發與測試,智慧醫院管理平台第一階段「醫院預約網站」的主要功能已經完成。
從最初使用 Figma 設計 UI,到將畫面實作成 HTML、CSS,再逐步轉換為 Angular Component,後續也加入 ASP.NET Core Web API 與 Oracle Database,讓原本只有前端畫面的網站,逐漸成為可以實際查詢醫師、登入會員及建立預約的系統。
在 Day 29 完成完整系統整合測試後,今天主要將已完成的功能與開發成果整理成作品集,並準備網站展示所需的畫面、操作流程及技術文件。
這次不以開發新功能為主,而是從整體系統的角度,重新檢視第一階段的功能、技術架構、完成程度與後續可以改善的地方。
專案最初先使用 Figma 規劃醫院預約網站的操作流程與頁面。
在進入程式開發前,我先思考一般使用者會如何使用醫院網站,例如:
接著逐步完成首頁、醫院介紹、醫師查詢、醫師詳細、會員登入、預約掛號、預約成功、我的預約、個人資料及就醫資訊等頁面的 UI 設計。
除了單一畫面,也使用 Figma Prototype 串接頁面,模擬使用者的操作流程。
透過這個階段,我了解到網站設計不只是把畫面做出來,也需要考慮使用者進入每個頁面的方式,以及操作完成後應該導向哪裡。
Figma Prototype 頁面
完成 Figma 設計後,我一開始先使用 HTML 與 CSS 練習將畫面實作成網頁。
最初完成的部分包括:
實作過程中,主要使用 Flexbox、CSS Grid、Media Query、Hover 等方式調整畫面。
後來考量網站會有多個頁面,而且不同頁面會重複使用 Header、Footer、醫師搜尋等區塊,因此開始將原本的 HTML、CSS 逐步轉換為 Angular Component。
例如:
Header Component
Hero Component
Quick Service Component
Doctor Search Component
Footer Component
透過 Component 的方式,可以讓相同的介面在不同頁面重複使用,也比較方便後續維護。
另外,也使用 Angular Router 管理多個頁面,讓網站不再只是獨立的 HTML 檔案,而是具有完整導覽結構的前端專案。
Angular 網站首頁

第一階段採用前後端分離架構,主要分為 Angular 前端、ASP.NET Core Web API 與 Oracle Database 三個部分。
前端主要負責:
使用技術包括:
| 技術 | 用途 |
|---|---|
| Angular 21 | 前端框架 |
| TypeScript | 前端程式邏輯 |
| HTML | 頁面結構 |
| CSS | 畫面樣式與 RWD |
| Angular Router | 頁面路由 |
| HttpClient | API 請求 |
| Reactive Forms | 表單管理與驗證 |
| RxJS | 非同步資料處理 |
後端主要負責接收 Angular 發送的請求,處理登入驗證、業務邏輯與資料庫存取。
例如:
後端使用 C# 與 ASP.NET Core .NET 9,並依照專案實際設計將程式拆分為 Controller、Service、Repository 與 DTO 等部分。
另外,會員登入使用 Cookie Authentication,修改資料的請求也加入 CSRF 保護。
Oracle 主要儲存系統需要的正式資料,例如:
以前端預約功能為例,當使用者選擇正式診次並確認預約時,Angular 會將指定資料送給 Web API。
後端確認會員身分、診次狀態及剩餘名額後,再處理 Oracle 資料庫交易。
完成後,前端可以透過 API 重新取得預約詳細資料。
flowchart TD
A["使用者瀏覽器"] --> B["Angular 前端"]
B -->|"HTTP API"| C["ASP.NET Core Web API"]
C --> D["業務邏輯與資料驗證"]
D --> E[("Oracle 19c Database")]
E --> D
D --> C
C -->|"JSON 回應"| B
B --> A
這次整理技術架構後,我對前後端分離的概念更加清楚。
Angular 不會直接連接 Oracle,而是由後端 API 負責處理資料存取及驗證,前端只需要依照 API 契約傳送請求並顯示回傳結果。
系統架構圖

除了前端畫面與後端 API,這次專案也使用 Oracle 19c 儲存會員、醫師及預約掛號等資料。
在開發初期,網站主要使用固定的 Demo 資料顯示畫面,後續開始建立正式的資料庫結構,並透過 ASP.NET Core Web API 將資料提供給 Angular。
目前第一階段主要使用以下資料表:
| 資料表 | 用途 |
|---|---|
| USERS | 儲存使用者帳號及登入相關資訊 |
| PATIENTS | 儲存病人基本資料及會員關聯 |
| DOCTORS | 儲存醫師資訊 |
| DOCTOR_SCHEDULES | 儲存指定日期的實際門診診次及名額 |
| APPOINTMENTS | 儲存預約掛號紀錄與狀態 |
這次透過不同資料表的關聯,讓會員可以查詢醫師、選擇診次,以及查看自己的預約紀錄。
主要資料關係可以簡化為:
flowchart TD
USERS["USERS 使用者"]
PATIENTS["PATIENTS 病人"]
DOCTORS["DOCTORS 醫師"]
SCHEDULES["DOCTOR_SCHEDULES 門診診次"]
APPOINTMENTS["APPOINTMENTS 預約紀錄"]
USERS -->|"會員與病人關聯"| PATIENTS
DOCTORS -->|"一位醫師可有多個診次"| SCHEDULES
PATIENTS -->|"一位病人可有多筆預約"| APPOINTMENTS
SCHEDULES -->|"一個診次可對應多筆預約"| APPOINTMENTS
這張圖呈現資料表的主要業務關係,方便理解系統如何將會員、醫師、診次及預約紀錄串接起來。
以預約掛號為例,使用者在 Angular 選擇醫師及診次後,前端會向 ASP.NET Core Web API 發送請求。
後端會確認登入會員的身分、診次是否開放,以及剩餘名額是否足夠,再透過 Oracle Transaction 處理預約資料。
完成後,使用者可以從預約成功頁、我的預約及預約詳細頁重新取得 Oracle 中的正式資料。
因此,前端不需要直接連接 Oracle,而是透過後端 API 完成資料存取。
在 Day 29 的整合測試中,我使用虛構會員建立一筆正式預約,並透過 Oracle SELECT 查詢,確認資料確實成功寫入。
本次新增的預約資料:
| 欄位 | 測試結果 |
|---|---|
| 預約 ID | 4 |
| 預約編號 | SC-A000000000004 |
| 病人 ID | 5 |
| 診次 ID | 2 |
| 預約狀態 | confirmed |
建立前後的資料比對:
| 項目 | 建立前 | 建立後 |
|---|---|---|
| 預約總數 | 2 | 3 |
| confirmed | 0 | 1 |
| cancelled | 2 | 2 |
| 診次剩餘名額 | 2 | 1 |
這次也確認原本兩筆已取消的預約紀錄沒有被修改,而新增的預約能從 Angular 的正式預約結果頁與我的預約頁重新查詢。
Oracle 資料庫關聯圖

這次重新整理目前已經完成的功能,並依照使用者實際操作網站的順序規劃展示。
首頁是使用者進入網站後最先看到的畫面。
主要包含:
首頁著重於讓使用者快速了解網站提供的服務,以及找到需要的功能。
其中,首頁搜尋目前仍保留既有 Demo 行為;正式醫師資料查詢則使用獨立的 /doctors 頁面。
網站首頁

正式醫師查詢頁透過 API 取得醫師資料。
使用者可以查看醫師資訊,進一步進入醫師詳細頁。
正式醫師詳細頁包含醫師介紹及相關門診資訊,也提供「立即預約」按鈕,讓使用者進入正式掛號流程。
主要路由:
/doctors
/doctors/1
透過這個功能,我將原本只顯示 Demo 醫師資料的頁面,逐步與 Oracle 正式醫師資料整合。
正式醫師查詢頁

正式醫師詳細頁

使用者可以透過會員註冊功能建立帳號,並使用登入功能進入需要會員身分的頁面。
這次使用 Cookie Authentication 管理登入狀態。
當使用者尚未登入,卻直接開啟需要驗證的正式預約頁面時,系統會引導使用者先登入。
登入完成後,再返回原本準備進入的頁面,減少使用者重新操作的步驟。
正式系統也包含登出及身分驗證相關處理。
會員登入頁面

會員登入註冊頁

正式預約掛號是這次第一階段最重要的核心功能之一。
使用者可以選擇指定日期,查詢該醫師的正式診次。
畫面會依照 API 回傳的資料顯示:
系統不會將已過期、未開放或無法預約的診次當作正常可選取項目。
確認預約時,也會進行表單驗證、CSRF 驗證及提交狀態控制,避免重複送出請求。
正式路由:
/reserve/1
正式預約掛號頁面

當正式預約建立成功後,系統會使用後端回傳的預約 ID 查詢詳細資料。
這次不再使用固定 Demo 預約編號,而是顯示 Oracle 中的正式預約紀錄。
結果頁包含:
即使使用者重新整理頁面,也可以再次透過 GET API 取得預約資料,不需要重新送出建立預約的請求。
在 Day 29 測試中,我已使用虛構會員成功建立一筆預約,並確認 Oracle 中存在相同資料。
這次成果展示則直接使用既有預約進行唯讀查詢,不再建立新預約。
展示路由:
/reservation-success/4
正式預約成功頁面

登入會員可以從「我的預約」查看自己的預約紀錄。
目前頁面可以顯示不同預約狀態,包括已預約及已取消。
使用者也可以點擊單筆預約,進入詳細頁面查看醫師、日期、預約編號與狀態等資訊。
正式路由:
/appointments
/appointments/4
這次展示使用 Day 29 已完成的虛構測試資料:
取消預約功能已有前後端實作及相關測試,但 Angular 取消 Dialog 的完整真實瀏覽器操作仍列為尚待補充驗收的部分。
因此,成果展示只查看既有紀錄,不進行取消操作。
我的預約列表

會員登入後,可以進入個人資料頁,查看會員及聯絡資訊。
這次也在個人資料卡片中加入「查看我的預約」按鈕,讓使用者能直接前往預約列表。
個人資料頁保留原本的編輯功能,以及已完成的 UI 設計。
正式路由:
/profile
目前 Profile API 及前端編輯介面已實作,相關 Mock 測試也已通過;但真實 Oracle 更新流程的完整驗收證據仍需要補齊。
此外,最新 Profile UI 在 375px、390px 手機寬度下的最終視覺檢查,也列入後續驗收。
個人資料頁

這次我將第一階段的主要功能整理成一條完整操作流程,方便未來使用影片、截圖或現場展示專案。
flowchart TD
A["首頁"] --> B["正式醫師查詢"]
B --> C["醫師詳細"]
C --> D{"是否已登入"}
D -->|"否"| E["會員登入"]
E --> F["正式預約掛號"]
D -->|"是"| F
F --> G["選擇日期與診次"]
G --> H["確認預約"]
H --> I["預約成功"]
I --> J["我的預約"]
J --> K["預約詳細"]
J --> L["個人資料"]
這是系統完整功能的操作流程。
不過,為了避免在成果展示時重複建立 Oracle 預約,我另外規劃了安全的展示方式:
首頁
↓
正式醫師查詢
↓
醫師詳細
↓
會員登入
↓
正式預約掛號頁
↓
展示日期、診次與剩餘名額
↓
開啟既有預約成功頁
↓
我的預約
↓
預約詳細
↓
個人資料
展示過程只進行查詢與頁面切換,不再次送出掛號,也不取消或修改既有資料。
這樣既能介紹完整的操作流程,也能保留 Day 29 已經完成的測試證據。
網站操作流程展示影片或
https://youtu.be/YMo9vVreOfU?si=Px2cV4B-_6ZrO75t
除了展示網站畫面,這次也將先前的測試成果整理到 README,讓讀者了解系統不是只有靜態介面。
Day 29 完成整合後,Angular 測試結果為:
| 項目 | 測試結果 |
|---|---|
| Angular 單元測試 | 422/422 通過 |
| TypeScript App | 通過 |
| TypeScript Spec | 通過 |
| Production Build | 成功 |
| Mock axe | 部分指定畫面通過 |
Mock axe 測試未完整涵蓋實際瀏覽器色彩對比,因此這部分仍與人工畫面驗收分開記錄。
Day 30 本次主要進行文件整理,沒有重新執行上述應用程式測試,所列結果沿用 Day 29 的實際紀錄。
Angular 測試結果

在 Day 29,我使用虛構會員 syy001,透過 Angular 網站完成一次正式掛號。
建立後透過 Oracle SELECT 確認:
| 項目 | 建立前 | 建立後 |
|---|---|---|
| 預約總數 | 2 | 3 |
| confirmed | 0 | 1 |
| cancelled | 2 | 2 |
| 診次剩餘名額 | 2 | 1 |
新增預約資訊:
| 欄位 | 實際結果 |
|---|---|
| 預約 ID | 4 |
| 預約編號 | SC-A000000000004 |
| 病人 ID | 5 |
| 診次 ID | 2 |
| 預約狀態 | confirmed |
另外也確認原本 ID 2、3 的取消紀錄沒有被更動。
這次測試證明,Angular 前端建立的預約能經由 ASP.NET Core Web API 寫入 Oracle,並且可以從正式預約成功頁、我的預約列表及詳細頁重新取得資料。
不過,建立當下沒有保存 POST 的 HTTP 狀態碼,因此不將 HTTP 201 列為已驗證結果。
Oracle 預約資料查詢結果

在第一階段前端開發中,我也持續調整網站的 RWD。
主要使用:
例如,桌面版的醫師卡片可以使用多欄排列,而手機版則依照螢幕寬度調整為較少欄位。
另外,也需要確認表單、導覽列與按鈕在小螢幕上不會超出畫面。
目前大部分前端頁面已有 RWD 設計,但最新個人資料頁的手機版仍需要補上實際 375px、390px 的截圖與確認。
桌面版與手機版 RWD 對照

雖然第一階段的主要預約流程已完成,但仍有一些尚未完成或需要進一步驗收的部分。
另外,首頁部分搜尋功能仍使用 Demo 資料,與正式醫師查詢頁不同。
這些限制已經整理到 README,讓作品集可以如實呈現目前的完成程度,不將未開發的功能寫成已完成。
本次主要修改的是 README 與 Day 30 相關 Markdown 文件,沒有修改 Angular、ASP.NET Core 或 Oracle 資料。
經過這 30 天的開發紀錄,智慧醫院管理平台第一階段已經完成從 UI 設計、前端實作,到後端 API 與 Oracle 整合的主要功能。
下一步希望先完成專案作品集整理,包括:
後續若要讓其他人直接操作網站,還需要考慮前後端部署、資料庫環境、測試帳號及資料安全等問題,因此目前先以 GitHub 原始碼、截圖及操作影片作為主要展示方式。
這次最大的收穫是,我不只完成了單一頁面或 API,而是從 Figma 開始,逐步學習 Angular 元件化、前後端分離、會員驗證、Oracle 資料庫操作及系統整合測試,最後將這些成果整理成一個完整的專案作品集。